<?php
set_time_limit(0);

$arr            = array();//测试数组

$arrLength        = 5000;//测试数组长度

$arrType        = 2;//1是1—1亿随机数字，2是8位字符串，3是32位字符串

$cycleTimes        = 100;//测试次数，尽量避免偶然情况

$searchTimes        = 50;//查找次数实际是50*2，50个能找到，50个找不到

$keywordArr        = array();//要比对的元素，数组形式保存

$resultArr        = array();//记录测试结果的数组


/**
 * 构造数组元素
 *
 * @access  public
 * @param   integer    $arrType    元素类型
 * @param   bool    $flag        为了构造差异元素
 * @return  string
 */
function creatItem($arrType = 1, $flag    = true)
{
	$item    = '';
	$seed    = $flag ? rand(1, 50000000) : rand(50000001, 100000000);
	switch($arrType)
	{
		case 1:
			$item    =  $seed;
			break;
		case 2:
			$item    = sprintf('%X', crc32($seed));
			break;
		default:
			$item    = md5($seed);
	}
	return $item;
}

//测试数组赋值，同时保存$searchTimes个能找到的元素
for($i=0;$i<$arrLength;$i++)
{
	$arr[]    = creatItem($arrType, true);
	if($i < $searchTimes)
	{
		$keywordArr[]    = $arr[$i];
	}
}

//构造$searchTimes个测试数组中没有的值
for($i=0;$i<$searchTimes;$i++)
{
	$keywordArr[]    = creatItem($arrType, false);
}

/*********************初始化结束*****************/

//每种方法测，都用到shuffle，所以这里顺便测试一下效率
$timeStart = gettimeofday();
for($i=0;$i<$cycleTimes;$i++)
{
	shuffle($arr);
}
$resultArr['shuffle']    = gettimeofday();

//开始循环测试foreach
for($i=0;$i<$cycleTimes;$i++)
{
	shuffle($arr);
	foreach($keywordArr AS $v)
	{
		foreach($arr AS $value)
		{
			if($value == $v)
			{
				break;
			}
		}
	}
}
$resultArr['foreach']    = gettimeofday();

//开始循环测试in_array
for($i=0;$i<$cycleTimes;$i++)
{
	shuffle($arr);
	foreach($keywordArr AS $v)
	{
		in_array($v, $arr);
	}
}
$resultArr['in_array']    = gettimeofday();

//开始循环测试array_search
for($i=0;$i<$cycleTimes;$i++)
{
	shuffle($arr);
	foreach($keywordArr AS $v)
	{
		array_search($v, $arr);
	}
}
$resultArr['array_search']    = gettimeofday();

//开始循环测试strpos
for($i=0;$i<$cycleTimes;$i++)
{
	shuffle($arr);
	$arraystring    = ',' . implode(',', $arr) . ',';
	foreach($keywordArr AS $v)
	{
		strpos($arraystring, ',' . $v . ',');
	}
}
$resultArr['strpos']    = gettimeofday();

//开始循环测试array_key_exists
for($i=0;$i<$cycleTimes;$i++)
{
	shuffle($arr);
	$arr    = array_flip($arr);
	foreach($keywordArr AS $v)
	{
		array_key_exists($v, $arr);
	}
}
$resultArr['array_key_exists']    = gettimeofday();

//开始循环测试isset($arr[$key])
for($i=0;$i<$cycleTimes;$i++)
{
	shuffle($arr);
	$arr    = array_flip($arr);
	foreach($keywordArr AS $v)
	{
		isset($arr[$v]);
	}
}
$resultArr['isset_key']    = gettimeofday();

//打印结果
echo var_dump($arrLength, $arrType, $cycleTimes, $searchTimes) . '<br />';
foreach($resultArr AS $k => $v)
{
	$time        = ($v["usec"]-$timeStart["usec"])/1000000+$v["sec"]-$timeStart["sec"];
	$time        = round($time, 6)."秒";
	echo    $time    . ' ' . $k . '<br />';
	$timeStart    = $v;
}

?>

